package es.indra.malaga.managedBeans;

import java.util.Locale;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

import es.indra.malaga.servicios.ILoginService;
import es.indra.malaga.servicios.IUsuarioService;
import es.indra.malaga.viewBeans.UsuarioView;

public class LoginBean {

	private static String PAGE_ADMIN = "adminPage";
	private static String PAGE_PROFESOR = "profesorPage";
	private static String PAGE_ALUMNO = "alumnoPage";

	private UsuarioView usuario;
	private ILoginService loginService;
	private IUsuarioService usuarioService;

	private boolean showGestionUsuarios;
	private boolean showGestionProfesores;
	private boolean showGestionAsignaturas;

	public LoginBean() {
		showGestionUsuarios = false;
		showGestionProfesores = false;
		showGestionAsignaturas = false;
	}

	public void onLogin(ActionEvent e) {
		desactivarVisualizacion();
		if (!loginService.validarUsuarioAutorizado(usuario)) {
			FacesMessage msg = new FacesMessage("Login error!", "ERROR MSG");
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			FacesContext.getCurrentInstance().addMessage(null, msg);
			throw new AbortProcessingException("Usuario invalido");
		}
		if (this.usuario.getLanguage() == null) {
			this.usuario.setLanguage("es");
		}
		String language = this.usuario.getLanguage();
		this.usuario = usuarioService.getUsuarioByName(usuario.getUsername());
		this.usuario.setLanguage(language);
		activarVisualizacion();
	}

	private void activarVisualizacion() {
		if (usuarioService.isUsuarioAdmin(usuario)) {
			showGestionUsuarios = true;
			showGestionProfesores = true;
			showGestionAsignaturas = true;
		} else if (usuarioService.isUsuarioProfesor(usuario)) {
			showGestionAsignaturas = true;
		}
	}

	private void desactivarVisualizacion() {
		showGestionUsuarios = false;
		showGestionProfesores = false;
		showGestionAsignaturas = false;
	}

	public String changeLanguage(String language) {
		this.usuario.setLanguage(language);
		Locale locale = new Locale(language);
		FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
		return "";
	}

	public String submit() {
		String outcome = "none";

		if (usuarioService.isUsuarioAdmin(usuario)) {
			outcome = PAGE_ADMIN;
			usuario.setRol(UsuarioView.USER_ROL_ADMIN);
		} else if (usuarioService.isUsuarioProfesor(usuario)) {
			outcome = PAGE_PROFESOR;
			usuario.setRol(UsuarioView.USER_ROL_PROFESOR);
		} else {
			outcome = PAGE_ALUMNO;
			usuario.setRol(UsuarioView.USER_ROL_ALUMNO);
		}

		System.out.println(outcome);
		return outcome;
	}

	public String logOut() {
		this.usuario = new UsuarioView();
		desactivarVisualizacion();
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(true);
		LoginBean loginBean = (LoginBean) session.getAttribute("loginBean");
		loginBean.setUsuario(new UsuarioView());
		session.removeAttribute("loginBean");
		session.setAttribute("loginBean", loginBean);
		session.removeAttribute("usuarioView");
		session.setAttribute("usuarioView", loginBean.getUsuario());
		session.invalidate();
		return "/access/login?faces-redirect=true";
	}

	public UsuarioView getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioView usuario) {
		this.usuario = usuario;
	}

	public ILoginService getLoginService() {
		return loginService;
	}

	public void setLoginService(ILoginService loginService) {
		this.loginService = loginService;
	}

	public IUsuarioService getUsuarioService() {
		return usuarioService;
	}

	public void setUsuarioService(IUsuarioService usuarioService) {
		this.usuarioService = usuarioService;
	}

	public boolean isShowGestionUsuarios() {
		return showGestionUsuarios;
	}

	public void setShowGestionUsuarios(boolean showGestionUsuarios) {
		this.showGestionUsuarios = showGestionUsuarios;
	}

	public boolean isShowGestionProfesores() {
		return showGestionProfesores;
	}

	public void setShowGestionProfesores(boolean showGestionProfesores) {
		this.showGestionProfesores = showGestionProfesores;
	}

	public boolean isShowGestionAsignaturas() {
		return showGestionAsignaturas;
	}

	public void setShowGestionAsignaturas(boolean showGestionAsignaturas) {
		this.showGestionAsignaturas = showGestionAsignaturas;
	}

}
